﻿#include "AF_Log.h"

#ifdef AF_DEBUG

#include "AF_Platform.h"

namespace AF
{
	Log g_Log;

	Log::Log() :
		m_strConsoleText(""),
		m_isFile(false)
	{
	}

	Log::~Log()
	{
		CloseFile();
	}

	void Log::ConsoleOut(_STRING strText, LogType ltType, _STRING strFile, int nLine, ...)
	{
		// 清空字符串
		m_strConsoleText.clear();

		// 写入类型头
		switch(ltType)
		{
		case LOG_NOTE:
			m_strConsoleText.append("");
			break;
		case LOG_WARM:
			m_strConsoleText.append("WARM: ");
			break;
		case LOG_LOG:
			m_strConsoleText.append("LOG: ");
			break;
		case LOG_MARK:
			m_strConsoleText.append("MARK: ");
			break;
		case LOG_ERROR:
			m_strConsoleText.append("ERROR: ");
			break;
		}

		// 解析格式化字符串
		const char* _szText = strText.c_str();
		char _szFormatText[1024];
		_VA_LIST _vlArgs;
		_VA_START(_vlArgs, nLine);
		_VSNPRINTF(_szFormatText, 1023, _szText, _vlArgs);
		_VA_END(_vlArgs);

		// 写入字符串
		m_strConsoleText.append(_szFormatText);

		// 换行
		if(ltType == LOG_WARM || ltType == LOG_LOG || ltType == LOG_ERROR)
			m_strConsoleText.append("\n");

		// 加入位置标记
		if(ltType == LOG_LOG || ltType == LOG_MARK || ltType == LOG_ERROR)
		{
			m_strConsoleText.append("\tAt - ");
			CreateMark(strFile, nLine);
			m_strConsoleText.append("\n");
		}

		// 输出
		AF_pTHEPLATFORM->ConsoleOut(m_strConsoleText);
		WriteFile(m_strConsoleText);
	}

	void Log::CreateMark(_STRING strFile, int nLine)
	{
		AF_CHECK(strFile != "");
		AF_CHECK(nLine > 0);

		_STRING _strFile_ = strFile.substr(strFile.find_last_of('/') + 1);
		_STRING _strFile = strFile.substr(_strFile_.find_last_of('\\') + 1);

		char _szLine[10];
		_SPRINTF(_szLine, "%d", nLine);
		m_strConsoleText.append("\"");
		m_strConsoleText.append(_strFile);
		m_strConsoleText.append("\" (LINE:");
		m_strConsoleText.append(_szLine);
		m_strConsoleText.append(")");
	}

	void Log::ToFile(_STRING strFileName)
	{
 		if(!m_isFile)
 		{
			m_ofLogFile.open(strFileName.c_str());
  			m_isFile = true;
 		}
	}

	void Log::CloseFile()
	{
 		if(m_isFile)
 		{
			m_ofLogFile.close();
  			m_isFile = false;
 		}
	}

	void Log::WriteFile(_STRING strText)
	{
 		if(m_isFile)
 		{
  			m_ofLogFile << strText;
 		}
	}

}

#endif /*AF_DEBUG*/